/*
* leetcode 25. K 个一组翻转链表
*
给你链表的头节点 head ，每 k 个节点一组进行翻转，请你返回修改后的链表。
k 是一个正整数，它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍，那么请将最后剩余的节点保持原有顺序。
你不能只是单纯的改变节点内部的值，而是需要实际进行节点交换。
* */
/*
* */
import java.util.*;
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if(head==null||head.next==null)return head;
        ListNode l=head,r=head,prev=new ListNode(-1),dummyNode=new ListNode(-1);
        dummyNode.next=head;
        prev=dummyNode;
        int n=0;
        while(r!=null){
            r=r.next;
            n++;
        }
        int t=n/k;
        l=prev.next;
        for(int i=0;i<t;i++){
            for(int j=0;j<k-1;j++){
                ListNode p=l.next;
                l.next=p.next;
                p.next=prev.next;
                prev.next=p;
            }
            prev=l;
            l=l.next;
        }
        return dummyNode.next;
    }
}

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}